#pragma once

#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>

//数据库配置
#define DBSERVER_IP "114.132.246.245"
#define DBSERVER_USER "cnl"
#define DBSERVER_PASSWD "cnl20021123"
#define DBSERVER_DB "ChatSystem"

//ChatServer配置
#define THREAD_SIZE 3
#define BIND_PORT 8888
#define EPOLL_ARR_SIZE 10

//safequeue配置
#define SAFEQUEUE_SIZE 5

enum MSG_TYPE
{
    REGISTER = 0,
    LOGIN,
    RESPONSE
};

enum RESPONSE_TYPE
{
    REGISTER_SUCCESS = 0,
    REGISTER_FAIL,
    LOGIN_SUCCESS,
    LOGIN_FAIL
};

//自定义协议
class CMsg
{
public:
    CMsg();
    ~CMsg();
    //消息类型
    CMsg(enum MSG_TYPE msg_type);
public:
    //服务端设置响应类型
    void SetResponse(enum RESPONSE_TYPE response);
    //将字符串反序列化成为CMsg
    bool ParseString(int socket_fd, std::string& body);
    //将CMsg序列化成为字符串  
    bool GetString(std::string& body);
    //设置json消息
    void SetNameValue(const std::string& name, const std::string val);
    void SetNameValue(const std::string& name, int val);
    //获取CMsg中msg_["name"]的值
    std::string GetValue(const std::string& name);
private:
    //Json序列化
    bool Serialize(const Json::Value& value, std::string& body);
    //Json反序列化
    bool UnSerialize(const std::string& body, Json::Value& value);
public:
    //供服务端接收线程将接收到的就绪描述符存入，方便发送线程使用
    int socket_fd_;

    int user_id_;

    //消息类型
    int msg_type_;
    //服务端响应类型
    int response_;
    //json消息
    Json::Value msg_;
};